package com.xbai.creation.singleton;

public final class Singleton {
    // 该字段必须声明为volatile，以便双重检查锁将正确工作
    private static volatile Singleton instance;

    public String value;

    private Singleton(String value) {
        this.value = value;
    }

    public static Singleton getInstance(String value) {
        // 在这里采取的方法称为双重检查锁定（DCL）。它的存在是为了防止可能试图同时获取单例实例的多个线程之间的争用情况，因此创建单独的实例。
        // 看起来这里的`result`变量似乎是毫无意义的。但是，在Java中实现双重检查锁定时有一个非常重要的警告，这可以通过引入此局部变量来解决。
        Singleton result = instance;
        if (result != null) {
            return result;
        }
        synchronized(Singleton.class) {
            if (instance == null) {
                instance = new Singleton(value);
            }
            return instance;
        }
    }
}